﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.ComponentModel;
using System.Xml;
using System.Globalization;
using System.IO;
using System.Security.Principal;
using System.Windows.Forms;
using System.Reflection;
using MAnt3.Properties;
using System.Collections.ObjectModel;
using System.CodeDom.Compiler;
using MAnt3.dll;
using System.Configuration;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;
using MAntLibrary;

namespace MAnt3
{
    //---------------------------------------------------------------------------------------------------------------------//
    //------------------------------------------------P-O-Z-N-A-M-K-Y------------------------------------------------------//
    // TELERIC
    // Zeptat se:
    // - 
    //
    //
    //
    // Dodělat:
    // - dodelat parovani
    // - testovat pokud nenalezne stahovany obrazek
    // - dodelat zalohovani programu (Db a nastaveni)
    // - window moznosti udelat jako potomka hlavniho okna aby kdyz se zavra hlavni okno zavre se i okno moznosti
    // - testovat situaci kdyz je DB ulozena kategorie ktera neni v comboxu protoze si ji uzivatel odstranil
    // - kdyz budu zavirat - ukladat okno moznosti musim spusti metodu overKonfiguraci
    // - dodelat blikajici button otevrit...
    // - combobox kategorie - musí být možnost upravit uživatelem
    // - poresit kdyz je zadane spatne heslo na ftp
    // - testovat scenar kdy uzivatel upravy polozky a po zmacknuti dokoncit zjisti ze ma napr spatne zadane heslo na FTP. Musi ho opravit a pak znovu dat dokoncit. Co se stane?
    // 
    // Vlastnosti programu
    //
    //---------------------------------------------------------------------------------------------------------------------//
    //---------------------------------------------------------------------------------------------------------------------//

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MojeInicializace();
        }

        #region Properties
        // cesty
        private string _DestinationPath;
        private string _DestinationPicturesPath;
        public FileInfo _InputFile;              

        // special
        public string _NEXTLINE = "\r\n";

        // tridni promenne
        private GenerovaniXml gen;
        private Ftp ftp;
        private Konfigurace konfigurace;
        private MoznostiWindow moznostiWindow;
        private WaitingWindow waitingwindos;
        private InformaciWindow informacniWindow;
        private IOproudy ioProudy;
        private IDodavatel _IDodavatel;
        private Dodavatel _ActualDodavatel;


        // pocitadla
        public int pocitadlo;

        // seznamy typu ZboziNedDir
        private List<ZboziNetDirect> NactenySeznam;
        private List<ZboziNetDirect> UpravenySeznam;

        // tento seznam uchova informace behem provadeni programu a nakonci je zobrazim
        List<InfoZaznam> seznamInformaci;
        List<InfoZaznam> seznamChyb;

        // promenne pro dialog otevreni
        Microsoft.Win32.OpenFileDialog dlg;
        FolderBrowserDialog fbd;
        Nullable<bool> result;
        Nullable<bool> result2;

        public bool novevytvoreno;
        public bool konecZobrazovani;
        public static bool preruseno;

        // seznam obrazku ke stazeni
        public List<Obrazek> seznamObrazku;

        // reprezentuje databazi jiz spracovanych produktu (resp. jejich popisku)
        // vyuziju tridy Obrazek ikdyz to stim nema nic spolecneho
        // uz vidim jak me to jednoho dne poplanta hlavu :-)
        //private List<DbProduktu> dbProduktu;

        // do promenne popisky ukladam hodnoty kratkeho a dlouho popisku, ktere jsem nacetl z DB
        DbProduktu popisky;

        // nove vlakno typu BackgroundWorker
        public BackgroundWorker FERDA;
        public BackgroundWorker PYTLIK;
        #endregion

        #region Background Worker Method

        private void InicializaceFerdy()
        {
            // nastavim handlery pro Ferdu1
            FERDA = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = false };
            FERDA.RunWorkerCompleted += PYTLIK_DOKONCENI_Complete;
            FERDA.ProgressChanged += FERDA2_NACTENIXML_Progress;
            FERDA.DoWork += PYTLIK_DOKONCENI_DoWork;
        }

        //
        // F E R D A 1 - nacteni ulozene pozice
        //
        public void FERDA1_NACTENI_POZICE_DoWork(object sender, DoWorkEventArgs e)
        {
            if (ioProudy.NacteniPozice2(_InputFile))
            {
                e.Result = true;
            }
            else
            {
                e.Result = false;
            }
        }

        public void FERDA1_NACTENI_POZICE_Complete(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Result.Equals(true))
            {
                //ioProudy.pridejPrispevek("Pozice načtena.", IOproudy.barvaBila, IOproudy.barvaCerna, false, true);
                info_green.Visibility = Visibility.Visible; 
            }
            else
            {
                //ioProudy.pridejPrispevek("Žádna uložená pozice.", IOproudy.barvaBila, IOproudy.barvaCerna, false, true);
                info_yellow.Visibility = Visibility.Visible;
            }
        }

        //
        // F E R D A  2 - nacteni XML
        //
        double qwerty;
        string pocetStahovanychObrazku = string.Empty;
        string pocetPridavanychProduktuDoDB = string.Empty;

        public void FERDA2_NACTENIXML_DoWork(object sender, DoWorkEventArgs e)
        {
            //metoda zpracování XML
            try
            {
                Cti();
            }
            catch (Exception ee)
            {
                System.Windows.Forms.MessageBox.Show(ee.ToString());
                IOproudy.writeLog(ee.ToString());
            }
        }       

        public void FERDA2_NACTENIXML_Progress(object sender, ProgressChangedEventArgs e)
        {
            string temp = Convert.ToString(e.UserState);

            if (temp.Equals("INK"))
            {
                baar.Value += e.ProgressPercentage;
                int d = Convert.ToInt32(baar.Value * qwerty);
                statusbarLabel.Content = d + "%";
            }
            else if (temp.Equals("MAX"))
            {
                baar.Maximum = e.ProgressPercentage;
                qwerty = 100.0 / e.ProgressPercentage;
                baar.Value = 0;
                statusbarLabel.Content = "0%";
            }
            else if (temp.Equals("MSG"))
            {
                string N = e.ProgressPercentage.ToString();

                switch (N)
                {
                    case "1":
                        lblProgressText.Content = "Zpracovávám XML soubor";
                        break;

                    case "2":
                        lblProgressText.Content = "Vytvářím XML soubory";
                        break;
                    
                    case "3":
                        lblProgressText.Content = string.Empty;
                        break;

                    case "4":
                        lblProgressText.Content = "Stahuji obrázky (" + pocetStahovanychObrazku + ")";
                        break;

                    case "6":
                        lblProgressText.Content = "Nahrávám obrázky na FTP";
                        break;

                    case "7":
                        lblProgressText.Content = "Nahrávám XML soubory na FTP";
                        break;

                    case "8":
                        lblProgressText.Content = "Přidávám produkty do databáze ("+pocetPridavanychProduktuDoDB+")";
                        break;

                    default:
                        break;
                }
            }
            else if (temp.Equals("VAL1"))
            {
                pocetPridavanychProduktuDoDB = e.ProgressPercentage.ToString();
            }
            else if (temp.Equals("VAL2"))
            {
                pocetStahovanychObrazku = e.ProgressPercentage.ToString();
            }
        }

        public void FERDA2_NACTENIXML_Complete(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled) 
            { 
                //TBinfo.Text += "Zrusili jste praci";
            }
            else if (e.Error != null) 
            { 
                //TBinfo.Text += "vyskystla se vyjiska: " + e.Error; 
            }
            else
            {
                // nastavim tlačítko Další na hodnotu Dokončit pokud má načtený soubor pouze jednu položku
                if (NactenySeznam.Count == pocitadlo+1)
                {
                    Bdalsi.Content = "Dokončit";
                }

                statusbarLabel.Content = string.Empty;
                lblProgressText.Content = string.Empty;
                baar.Value = 0;
                Krok3();
                InicializaceFerdy();
                IOproudy.PridejPrispevek("Zpracování XML souboru", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
                UkazNacteneInformace();
            }
        }

        //
        // F E R D A  3 - dokoncovaci operace
        //
        public void PYTLIK_DOKONCENI_DoWork(object sender, DoWorkEventArgs e)
        {
            // metoda spusti sadu metod pro generovani xml

            // PRO FASTCENTRIK 1.0
            gen.VytvorXml(_DestinationPath, _ActualDodavatel.JmenoDodavatele, UpravenySeznam);
            
            // PRO FASTCENTRIK 2.0
            //_IDodavatel.VytvorXML(_DestinationPath, _ActualDodavatel.JmenoDodavatele, UpravenySeznam);

            // stahnuti obrazku
            ftp.StahniObrazky(seznamObrazku, _DestinationPicturesPath);

            // nahravani obrazku na FTP
            ftp.NahrajObrazkyNaFtp(_DestinationPicturesPath);

            // nahrani xml souboru na FTP 
            ftp.NahrajXmLnaFtp(_DestinationPath);

            // vytvorim xml soubor s databazi vyrobku
            gen.vytvorDBProduktu1(dbProduktu, _ActualDodavatel.JmenoDodavatele);

            // volitelna funkce - smaz vytvorene xml a stazene obrazky

            // provedu upload chyboveho souboru na FTP
            //ioProudy.UploadErrorLog();
        }

        public void PYTLIK_DOKONCENI_Complete(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled) 
            { 
                //TBinfo.Text += "Zrusili jste praci"; 
            }
            else if (e.Error != null) 
            { 
                //TBinfo.Text += "vyskystla se vyjimka: " + e.Error; 
            }
            else
            {
                IOproudy.PridejPrispevek("Vytvoření XML souborů", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
                IOproudy.PridejPrispevek("Stahování obrázků (" + pocetStahovanychObrazku + ")", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
                IOproudy.PridejPrispevek("Nahrávání obrázků na FTP", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
                IOproudy.PridejPrispevek("Nahrávání XML souborů na FTP", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
                IOproudy.PridejPrispevek("Přidání produktů do databáze (" + pocetPridavanychProduktuDoDB + ")", "Hotovo", DateTime.Now, IOproudy.barvaZelena);

                statusbarLabel.Content = "Hotovo";
                lblProgressText.Content = string.Empty;
                informacniWindow.Show();
            }
            
        }      
        //--------------------------------------------------------------------------------------------/
        //--------------------------------------------------------------------------------------------/
        //--------------------------------------------------------------------------------------------/
        #endregion

        #region Read XML

        private void Cti()
        {
            XmlDocument doc = new XmlDocument();
            XmlNode root = null;

            //  nastavit kodovani xml

            if (_InputFile.Extension.Equals(".xml") || _InputFile.Extension.Equals(".XML"))
            {
                try { doc.Load(_InputFile.FullName); }
                catch (Exception e)
                {
                    IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, e.ToString(), DateTime.Now);
                    return;
                }

                // ziskani korenoveho elementu
                root = doc.DocumentElement;
            }
                     

            // aktualizuji progress bar
            FERDA.ReportProgress(1, "MSG");

            NactenySeznam = _IDodavatel.CtiXml(root, _InputFile, _ActualDodavatel);            
        }
        #endregion

        #region Show Information

        public void UkazNacteneInformace()
        {
            nactenoCheckBox.IsChecked = false;

            // nactu z DB informace jestli tam jsou
            NactiProduktyZdb();

            // vymazu textbox s Parametry
            textBox6.Text = string.Empty;

            // zobrazim informace individualne pro kazdeho dodavatele
            textBox6.Text = _IDodavatel.ZobrazInformace(NactenySeznam, pocitadlo);
            
            // premistim kursor
            if (cmbKategorie.Focusable) 
            {
                cmbKategorie.Focus(); 

                // Docasne pro HEUREKA
                //cmbKategorie.Text = ZboziList[pocitadlo].Kategorie.JmenoKategorie;
            }

            // vypisu do textboxu aktualni polozku
            label19.Content = pocitadlo+1 + "/" + NactenySeznam.Count;

            // spolecne informace
            textBox4.Content = NactenySeznam[pocitadlo].JmenoVyrobku;
            label17.Content = NactenySeznam[pocitadlo].PuvodniCena;
            txbNovaCena.Text = NactenySeznam[pocitadlo].NovaCena;

            if (!string.IsNullOrEmpty(NactenySeznam[pocitadlo].Dostupnost))
            {
                comboBox2.Text = NactenySeznam[pocitadlo].DostupnostNazev;
            }
            // navysim pocitadlo
            pocitadlo++;
        }

        // aktualizuju kratky popisek, dlouhy a kategorii pokud existuje
        private void NactiProduktyZdb()
        {
            // podle znacky nactu spravny soubor
            string dbFile = konfigurace.MantSettingsPath + konfigurace.MantCestaKdb + @"\" + _ActualDodavatel.JmenoDodavatele + ".xml";
            
            // do promenne popisky nactu data z DB
            if (File.Exists(dbFile))
            {
                popisky = nactiPopiskyZdb(dbFile, NactenySeznam[pocitadlo].JmenoVyrobku);
            }
            else
            {
                return;
            }

            if (popisky.Id != "0")
            {
                tbxKratkyPopis.Text = popisky.KratkyPopis;
                tbxDlouhyPopis.Text = popisky.DlouhyPopis;
                cmbKategorie.Text = popisky.Kategorie; 
                nactenoLabel.Content = "Načteno";
                nactenoLabel.Foreground = IOproudy.barvaZelena2;
                nactenoCheckBox.IsEnabled = true;
            }
            else
            {
                tbxDlouhyPopis.Text = NactenySeznam[pocitadlo].Popis;
                // orezu popisek pokud je delsi nez 250znaku (kratky popisek)
                if (NactenySeznam[pocitadlo].KratkyPopis != null)
                {
                    tbxKratkyPopis.Text = NactenySeznam[pocitadlo].KratkyPopis.Length >= 250 ? NactenySeznam[pocitadlo].KratkyPopis.Substring(0, 250) : NactenySeznam[pocitadlo].KratkyPopis;
                }

                nactenoLabel.Content = "Nenalezeno";
                nactenoLabel.Foreground = IOproudy.barvaCervena2;
                nactenoCheckBox.IsEnabled = false;
            }
        }

        // nactu data do pole 
        private DbProduktu nactiPopiskyZdb(string path, string nazevProduktu)
        {
            DbProduktu result = new DbProduktu();
            XmlDocument doc = new XmlDocument();
            try { doc.Load(path); }
            catch { return result; }

            XmlNode root = doc.DocumentElement;
            foreach (XmlNode n in root.ChildNodes)
            {
                if (n.Attributes["nazev"].Value.Equals(nazevProduktu))
                {
                    result.Id           = n.Attributes["id"].Value;
                    result.Nazev        = n.Attributes["nazev"].Value;
                    result.KratkyPopis  = n.Attributes["kratkyPopis"].Value;
                    result.DlouhyPopis  = n.Attributes["dlouhyPopis"].Value;
                    result.Kategorie    = n.Attributes["kategorie"].Value;
                    return result;
                }
            }
            return result;
        }
        
        #endregion

        #region Save Data

        private void UlozData()
        {
            string timestamp = DateTime.Now.ToString("yyyyMMddhhmmss", CultureInfo.InvariantCulture);
            ZboziNetDirect noveZbozi = new ZboziNetDirect();

            // Vyrobci, kteri nemaji ve svem XML feedu id produktu dostanou ID vygenerovane programem
            if ( string.IsNullOrEmpty( NactenySeznam[pocitadlo - 1].IdZbozi) )
            {
                noveZbozi.IdZbozi = "Z" + timestamp;
                noveZbozi.KodZbozi = "z" + timestamp;
            }
            // Ostatni vyrobci dostanou ID z jejich XML feedu
            else
            {
                noveZbozi.IdZbozi = NactenySeznam[pocitadlo - 1].IdZbozi;
                noveZbozi.KodZbozi = NactenySeznam[pocitadlo - 1].KodZbozi;
            }

            // stejne hodnoty pro vsechny vyrobce
            noveZbozi.JmenoVyrobku = NactenySeznam[pocitadlo - 1].JmenoVyrobku;
            noveZbozi.KratkyPopis = tbxKratkyPopis.Text;
            noveZbozi.Popis = tbxDlouhyPopis.Text;
            noveZbozi.JmenoVyrobce = _ActualDodavatel.JmenoDodavatele;
            noveZbozi.setNovaCena(txbNovaCena.Text);
            noveZbozi.ZarukaMesicu = "24";
            noveZbozi.Dph = "20";
            noveZbozi.Dostupnost = comboBox2.Text;
            noveZbozi.DostupnostNazev = gen.DostupnostNazev(comboBox2.Text);
            noveZbozi.DostupnostPopis = gen.DostupnostPopis(comboBox2.Text);
            noveZbozi.Akcni = "0";
            noveZbozi.NejprodavanejsiKategorie = "0";
            noveZbozi.NejprodavanejsiEshop = "0";
            noveZbozi.Novinka = comboBox3.Text;
            noveZbozi.Tip = "0";
            noveZbozi.ZboziPoradi = "0";
            noveZbozi.AkcniPoradi = "0";
            noveZbozi.NejprodKategPoradi = "0";
            noveZbozi.NejprodEshopPoradi = "0";
            noveZbozi.NovinkaPoradi = "0";
            noveZbozi.TipPoradi = "0";
            noveZbozi.Vypnout = "0";
            noveZbozi.DefaultMnozstviDoKosiku = "1";
            noveZbozi.Kategorie.Id = Kategorie.getIDkategorie(cmbKategorie.Text);

            /********* Specialni Parametry ***************/
            _IDodavatel.UlozData(NactenySeznam, pocitadlo, ref noveZbozi);            

            // orezu url obrazku abych dostal nazev a pak url pridam do seznamu a pozdeji postahuju
            string[] value = NactenySeznam[pocitadlo - 1].getJmenoObrazku(0).Split('/');
            noveZbozi.JmenoObrazku = value[value.Length - 1];
            seznamObrazku.Add(new Obrazek(NactenySeznam[pocitadlo - 1].getJmenoObrazku(0), value[value.Length - 1]));

            noveZbozi.setVarianty(NactenySeznam[pocitadlo - 1].getVarianty());

            // pridam do seznamu nove zbozi
            UpravenySeznam.Add(noveZbozi);

            // pridam zbozi do dbProduktu
            dbProduktu.Add(new DbProduktu(NactenySeznam[pocitadlo-1].IdZbozi, NactenySeznam[pocitadlo - 1].JmenoVyrobku, tbxKratkyPopis.Text, tbxDlouhyPopis.Text, cmbKategorie.Text));

            // zobrazim dalsi polozku
            if (!konecZobrazovani)
            {
                UkazNacteneInformace();
            }
        }
        #endregion

        #region Help Method

        // spoustena pri spusteni programu
        private void MojeInicializace()
        {
            // jenom test
            //Settings.Default.kategorie = string.Empty;

            // radsi inicializuju hned na zacatku
            seznamInformaci = new List<InfoZaznam>();
            seznamChyb = new List<InfoZaznam>();

            WindowsIdentity.GetCurrent();

            // nactu nastaveni programu
            konfigurace = new Konfigurace();

            IndividualniGUI(konfigurace.TypAplikace);

            //--------------------------------------------//
            // otestruju jestli nebyla aplikace prerusena
            if (konfigurace.kontrola())
            {
                App.Current.Shutdown();
                return;
            }
            //--------------------------------------------//

            // vytvorim slozku pro DB a soubor pro db
            IOproudy.VytvorSlozkuDb(konfigurace.MantSettingsPath, konfigurace.MantCestaKdb);

            // vytvorim slozku pro ulozeni parovani
            IOproudy.VytvorSlozkuParovani(konfigurace.MantSettingsPath, konfigurace.MantCestaKparovani);

            // inicializuju PYTLIKA
            PYTLIK = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = false };
            PYTLIK.RunWorkerCompleted += PYTLIK_DOKONCENI_Complete;
            PYTLIK.ProgressChanged += FERDA2_NACTENIXML_Progress;
            PYTLIK.DoWork += PYTLIK_DOKONCENI_DoWork;

            NactenySeznam = new List<ZboziNetDirect>();
            UpravenySeznam = new List<ZboziNetDirect>();
            seznamObrazku = new List<Obrazek>();
            dbProduktu = new List<DbProduktu>();
            _ActualDodavatel = new Dodavatel();

            preruseno = false;
            konecZobrazovani = false;

            pocitadlo = 0;
            popisky = new DbProduktu();
            statusbarLabel.Content = "---";
            lblProgressText.Content = string.Empty;

            info_yellow.Visibility = Visibility.Hidden;
            info_green.Visibility = Visibility.Hidden;

            ioProudy = new IOproudy(konfigurace, seznamInformaci, seznamChyb);
            ftp = new Ftp(this, ioProudy, PYTLIK, konfigurace);

            // inicializuju okno MoznostiWindow
            moznostiWindow = new MoznostiWindow(konfigurace,this, ioProudy);
            moznostiWindow.Hide();
            moznostiWindow.ShowInTaskbar = true;
            //moznostiWindow.Topmost = true;            

            // inicializuju okno InformacniWindow
            informacniWindow = new InformaciWindow(this,moznostiWindow, seznamInformaci, seznamChyb, konfigurace);
            informacniWindow.Hide();
            moznostiWindow.ShowInTaskbar = true;

            cmbDodavatel.ItemsSource = Dodavatel.getDodavatele(true, true);
            cmbKategorie.ItemsSource = Kategorie.getKategorie(true, true);

            label14.Content = string.Empty;
            label19.Content = "---";
            label16.Content = "---";
            label17.Content = "---";

            Krok1();
        }

        // metoda musi pripravit program pro opetovny chod vynulovani vsech dulezitych promennych
        public void ResetovaniPromennych()
        {
            InitializeComponent();

            // zpristupnim nektere buttony
            cmbDodavatel.ItemsSource = Dodavatel.getDodavatele(true, true);
            cmbDodavatel.Text = string.Empty;
            cmbKategorie.ItemsSource = Kategorie.getKategorie(true, true);

            // vynuluju promenne a kontroly
            seznamInformaci.Clear();
            seznamChyb.Clear();

            NactenySeznam = new List<ZboziNetDirect>();
            UpravenySeznam = new List<ZboziNetDirect>();
            seznamObrazku = new List<Obrazek>();
            dbProduktu = new List<DbProduktu>();
            _IDodavatel = null;
            _ActualDodavatel = new Dodavatel();

            preruseno = false;
            konecZobrazovani = false;

            pocitadlo = 0;
            popisky = new DbProduktu();
            baar.Value = 0;
            statusbarLabel.Content = "---";
            lblProgressText.Content = string.Empty;

            info_yellow.Visibility = Visibility.Hidden;
            info_green.Visibility = Visibility.Hidden;

            label14.Content = string.Empty;
            label19.Content = "---";
            label16.Content = "---";
            label17.Content = string.Empty;

            textbox30.Text = string.Empty;
            textBox2.Text = string.Empty;
            textBox4.Content = "---";
            label17.Content = "---";
            cmbKategorie.Text = string.Empty;
            txbNovaCena.Text = string.Empty;
            textBox6.Text = string.Empty;
            tbxDlouhyPopis.Text = string.Empty;
            tbxKratkyPopis.Text = string.Empty;
            nactenoLabel.Content = string.Empty;
            lblProgressText.Content = string.Empty;
            statusbarLabel.Content = string.Empty;

            // uplne nakonec buttony
            btnOpenFile.IsEnabled = true;
            btnShutdown.IsEnabled = true;
            btnMinimalize.IsEnabled = true;
            btnSettings.IsEnabled = true;
            Bdalsi.IsEnabled = false;
            bUlozit.IsEnabled = false;

        }

        // volana pri zmene nasteveni behem beziciho programu
        public void PozdniInicializace()
        {
            // combobox s KATEGORIEMI
            cmbKategorie.ItemsSource = Kategorie.getKategorie(true, true);
                
            // aktualizace slevy v %
            Dodavatel.setDodavatele(Settings.Default.dodavatele);
        }

        private void InicializaceDodavatele()
        {
            // inicializuji promennou DODAVATEL
            _IDodavatel = (IDodavatel)System.Activator.CreateInstance(Type.GetType("MAnt3.dll." + _ActualDodavatel.JmenoDodavatele), ioProudy);

            // inicializuji potrebne objekty
            gen = new GenerovaniXml(this, konfigurace, PYTLIK, ioProudy, _IDodavatel);
        }

        public void Krok1()
        {
            cmbDodavatel.IsEnabled = false;
            Bstart.IsEnabled = false;
            Bprochazet.IsEnabled = false;
            Bpreskocit.IsEnabled = false;
            textBox2.IsEnabled = false;
            comboBox2.IsEnabled = false;
            comboBox3.IsEnabled = false;
            cmbKategorie.IsEnabled = false;
            textBox6.IsEnabled = false;
            tbxDlouhyPopis.IsEnabled = false;
            tbxKratkyPopis.IsEnabled = false;
            txbNovaCena.IsEnabled = false;
            textbox30.IsEnabled = false;
            Bdalsi.IsEnabled = false;
            bUlozit.IsEnabled = false;
            nactenoCheckBox.IsEnabled = false;
        }

        public void Krok2()
        {
            cmbDodavatel.IsEnabled = true;
        }

        public void Krok3()
        {
            textBox2.IsEnabled = false;
            btnOpenFile.IsEnabled = false;
            Bprochazet.IsEnabled = false;
            Bstart.IsEnabled = false;
            cmbDodavatel.IsEnabled = false;
            comboBox2.IsEnabled = true;
            comboBox3.IsEnabled = true;
            cmbKategorie.IsEnabled = true;
            textBox6.IsEnabled = true;
            tbxDlouhyPopis.IsEnabled = true;
            tbxKratkyPopis.IsEnabled = true;
            txbNovaCena.IsEnabled = true;
            textbox30.IsEnabled = false;
            Bdalsi.IsEnabled = true;
            Bpreskocit.IsEnabled = true;
            bUlozit.IsEnabled = true;
            nactenoCheckBox.IsEnabled = true;
        }

        public void Krok4()
        {
            comboBox2.IsEnabled = false;
            comboBox3.IsEnabled = false;
            cmbKategorie.IsEnabled = false;
            textBox6.IsEnabled = false;
            tbxDlouhyPopis.IsEnabled = false;
            tbxKratkyPopis.IsEnabled = false;
            txbNovaCena.IsEnabled = false;
            Bdalsi.IsEnabled = false;
            Bpreskocit.IsEnabled = false;
            bUlozit.IsEnabled = false;
            nactenoCheckBox.IsEnabled = false;
            btnShutdown.IsEnabled = false;
            btnMinimalize.IsEnabled = false;
            btnSettings.IsEnabled = false;
        }

        public void Krok5()
        {
            comboBox2.IsEnabled = false;
            comboBox3.IsEnabled = false;
            cmbKategorie.IsEnabled = false;
            textBox6.IsEnabled = false;
            tbxDlouhyPopis.IsEnabled = false;
            tbxKratkyPopis.IsEnabled = false;
            txbNovaCena.IsEnabled = false;
            Bdalsi.IsEnabled = false;
            Bpreskocit.IsEnabled = false;
            bUlozit.IsEnabled = false;
            btnOpenFile.IsEnabled = false;
            Bprochazet.IsEnabled = false;
            Bstart.IsEnabled = false;
            cmbDodavatel.IsEnabled = false;
            textBox2.IsEnabled = false;
            nactenoCheckBox.IsEnabled = false;
        }

        // dialog pro otevreni
        public void OpenFile()
        {
            dlg = new Microsoft.Win32.OpenFileDialog();
            dlg.Filter = "XML dokument (*.xml; *.XML) | *.xml; *.XML | CVS dokument (*.cvs; *.CVS) | *.cvs; *.CVS | XLS dokument (*.xls) | *.XLS; *.xls | TXT dokument (*.txt; *.TXT) | *.txt; *.TXT";

            result = dlg.ShowDialog();

            if (result == true)
            {
                textbox30.Text = dlg.FileName;

                _InputFile = new FileInfo(dlg.FileName);
                textBox2.IsEnabled = true;
                Bprochazet.IsEnabled = true;
                textbox30.IsEnabled = true;

                // nactu ulozenou pozici pokud existuje
                // nastavim handlery pro Ferdu1
                FERDA = new BackgroundWorker { WorkerReportsProgress = false, WorkerSupportsCancellation = false };
                FERDA.RunWorkerCompleted += FERDA1_NACTENI_POZICE_Complete;
                //FERDA_MRAVENEC.ProgressChanged += ;
                FERDA.DoWork += FERDA1_NACTENI_POZICE_DoWork;

                // spustim Ferdu
                FERDA.RunWorkerAsync();
            }
        }

        private void IndividualniGUI(string p)
        {
         
        }
        #endregion

        #region Button Events

        // dialog pro otevreni souboru
        private void btnClick_OpenFile(object sender, RoutedEventArgs e)
        {
            OpenFile();
        }

        //dialog pro zadani cesty pro ulozeni
        private void btnClick_Explore(object sender, RoutedEventArgs e)
        {
            fbd = new FolderBrowserDialog();
            DialogResult result = fbd.ShowDialog();
            if (result.ToString().Equals("OK"))
            {
                textBox2.Text = fbd.SelectedPath;
                Krok2();
            }
        }

        // tlacitko START
        private void btnClick_Start(object sender, RoutedEventArgs e)
        {
            // nastavim instanci na tridu IDodavatel
            InicializaceDodavatele();

            foreach (string item in _IDodavatel.GetDostupnostNazev())
            {
                comboBox2.Items.Add(item);
            }

            //vytvorim adresar pro xmlka
            _DestinationPath = fbd.SelectedPath + "\\" + _ActualDodavatel.JmenoDodavatele + "-" + DateTime.Now.ToString("yyyy-MM-dd (hh-mm-ss)", CultureInfo.InvariantCulture);
            _DestinationPicturesPath = _DestinationPath + "\\obrazky";
            IOproudy.VytvorSlozku(_DestinationPath);
            IOproudy.VytvorSlozku(_DestinationPicturesPath);

            // nastavim defaultni hodnoty
            //comboBox2.Text = "B";
            comboBox3.Text = "ne";
            foreach (Dodavatel d in Dodavatel.getDodavatele())
            {
                if (d.JmenoDodavatele.Equals(_ActualDodavatel.JmenoDodavatele))
                {
                    label16.Content = d.SlevaProDodavatele.ToString();
                    _ActualDodavatel.SlevaProDodavatele = d.SlevaProDodavatele;
                    continue;
                }
            }

            // zakazu tlacitko pro nastaveni
            btnSettings.IsEnabled = false;

            // nastavim handlery pro Ferdu
            FERDA = new BackgroundWorker { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
            FERDA.RunWorkerCompleted += FERDA2_NACTENIXML_Complete;
            FERDA.ProgressChanged += FERDA2_NACTENIXML_Progress;
            FERDA.DoWork += FERDA2_NACTENIXML_DoWork;

            // spustim Ferdu
            FERDA.RunWorkerAsync();
        }

        // preskoceni produktu
        private void btnClick_Skip(object sender, RoutedEventArgs e)
        {
            // Posledni polozka
            if (NactenySeznam.Count == pocitadlo)
            {
                // overim pripojeni k internetu
                if (Ftp.OvereniPripojeni() == false)
                {
                    IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, "Připojení k internetu není k dispozici. Obnov připojení a opakuj akci.", DateTime.Now);
                    return;
                }

                // ulozi uzivatelem zadane data
                konecZobrazovani = true;

                // dokoncil jsem zpracovani xml takze musim smazat ulozenou pozici pokud existuje
                ioProudy.SmazatPozici(_InputFile.FullName);

                Krok4();
                PYTLIK.RunWorkerAsync();
            }

            // pokud jsem na predposledni polozce zmeni popisek tlacitka DALSI na DOKONCIT
            else if (NactenySeznam.Count - 1 == pocitadlo)
            {
                Bdalsi.Content = "Dokončit";
                UkazNacteneInformace();
            }
            else
            {
                UkazNacteneInformace();
            }
        }

        // prubezne ulozeni
        private void btnClick_Save(object sender, RoutedEventArgs e)
        {
            // kontrola jestli uzivatel vyplnil povinne udaje [napr. kategorie atd.]
            if (string.IsNullOrEmpty(cmbKategorie.Text))
            {
                preruseno = true;
                System.Windows.Forms.MessageBox.Show("Neurčili jste hodnotu kategorie", "Upozornění", MessageBoxButtons.OK);
                return;
            }
            else if (string.IsNullOrEmpty(comboBox2.Text))
            {
                preruseno = true;
                DialogResult d = System.Windows.Forms.MessageBox.Show("Neurčili jste hodnotu dostupnosti", "Upozornění", System.Windows.Forms.MessageBoxButtons.OK);
                return;
            }
            else
            {
                preruseno = false;
            }

            // overim pripojeni k internetu
            if (!Ftp.OvereniPripojeni())
            {
                IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, "Připojení k internetu není k dispozici. Obnov připojení a opakuj akci.", DateTime.Now);
                System.Windows.MessageBox.Show("Aplikace nemá přístup k internetu. Obnov připojení a opakuj akci.", "Připojení k internetu není k dispozici", MessageBoxButton.OK);
                return;
            }

            // ulozim pozici na ktere jsem zkoncil aby se dalo pokracovat
            if (_InputFile.Extension.Equals(".xml") || _InputFile.Extension.Equals(".XML"))
            {
                if (!ioProudy.UlozeniPozice2(_InputFile, pocitadlo))
                {
                    IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, "Pozice nebyla uložena. Opakujte akci.", DateTime.Now);
                    return;
                }

                IOproudy.PridejPrispevek("Pozice byla uložena.", "Hotovo", DateTime.Now, IOproudy.barvaZelena);
            }

            // ulozim
            konecZobrazovani = true;

            UlozData();

            Krok4();
            PYTLIK.RunWorkerAsync();
        }

        // skok na dalsi produkt
        private void btnClick_Next(object sender, RoutedEventArgs e)
        {
            // kontrola jestli uzivatel vyplnil povinne udaje [napr. kategorie atd.]
            if (string.IsNullOrEmpty(cmbKategorie.Text))
            {
                preruseno = true;
                DialogResult d = System.Windows.Forms.MessageBox.Show("Neurčili jste hodnotu kategorie", "Upozornění", System.Windows.Forms.MessageBoxButtons.OK);
                return;
            }
            else if (string.IsNullOrEmpty(comboBox2.Text))
            {
                preruseno = true;
                DialogResult d = System.Windows.Forms.MessageBox.Show("Neurčili jste hodnotu dostupnosti", "Upozornění", System.Windows.Forms.MessageBoxButtons.OK);
                return;
            }
            else
            {
                preruseno = false;
            }

            // Posledni polozka
            if (NactenySeznam.Count == pocitadlo)
            {
                // overim pripojeni k internetu
                if (Ftp.OvereniPripojeni() == false)
                {
                    IOproudy.PridejChybu(MethodInfo.GetCurrentMethod().Name, "Připojení k internetu není k dispozici. Obnov připojení a opakuj akci.", DateTime.Now);
                    return;
                }

                // ulozi uzivatelem zadane data
                konecZobrazovani = true;
                UlozData();

                // dokoncil jsem zpracovani xml takze musim smazat ulozenou pozici pokud existuje
                ioProudy.SmazatPozici(_InputFile.FullName);

                Krok4();
                PYTLIK.RunWorkerAsync();
            }
            else
            {
                // pokud jsem na predposledni polozce zmeni popisek tlacitka DALSI na DOKONCIT
                if (NactenySeznam.Count == pocitadlo + 1)
                {
                    Bdalsi.Content = "Dokončit";
                }
                UlozData();
            }
        }

        // dialog pro otevreni nastaveni
        private void btnClick_Settings(object sender, RoutedEventArgs e)
        {
            moznostiWindow.Show();
        }

        // bezpecne vypnuti programu
        private void btnClick_Shutdown(object sender, RoutedEventArgs e)
        {
            DialogResult r = System.Windows.Forms.MessageBox.Show("Opravdu chcete ukončit program?", "Ukončení programu", System.Windows.Forms.MessageBoxButtons.YesNo);

            // ulozim vsechny nastavene hodnoty
            konfigurace.ulozKonfiguraci();
            
            moznostiWindow.Close();
            this.Close();
        }

        // minimalizace programu
        private void bntClick_Minimalize(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }

        // h1 nadpis
        private void Nadpis(string nadpisS, string nadpisE)
        {
            string result = string.Empty;

            if (tbxDlouhyPopis.SelectedText != "") { result = tbxDlouhyPopis.SelectedText; }
            if (tbxKratkyPopis.SelectedText != "") { result = tbxKratkyPopis.SelectedText; }

            result = result.Insert(0, nadpisS);
            result = result.Insert(result.Length, nadpisE);

            if (tbxDlouhyPopis.SelectedText != "") { tbxDlouhyPopis.SelectedText = result; tbxDlouhyPopis.SelectionLength = 0; }
            if (tbxKratkyPopis.SelectedText != "") { tbxKratkyPopis.SelectedText = result; tbxKratkyPopis.SelectionLength = 0; }
        }

        private void bntH1Click(object sender, RoutedEventArgs e)
        {
            Nadpis("<h1>", "</h1>");
        }

        private void bntH2Click(object sender, RoutedEventArgs e)
        {
            Nadpis("<h2>", "</h2>");
        }

        private void bntH3Click(object sender, RoutedEventArgs e)
        {
            Nadpis("<h3>", "</h3>");
        }
        #endregion

        #region Another Events

        // KONTROLA ZADANE CENY
        private void tbxTextChange_NovaCena(object sender, TextChangedEventArgs e)
        {
            string s = txbNovaCena.Text;

            try
            {
                double f = Convert.ToDouble(s);
                Bdalsi.IsEnabled = true;
                bUlozit.IsEnabled = true;
            }
            catch
            {
                Bdalsi.IsEnabled = false;
                bUlozit.IsEnabled = false;
            }
        }


        // KONTROLA POCTU ZNAKU KRATKEHO POPISKU
        private void tbxTextChange_KratkyPopis(object sender, TextChangedEventArgs e)
        {
            string s = tbxKratkyPopis.Text;
            int delka = s.Length;
            label14.Content = delka.ToString();

            if (delka > 250)
            {
                Bdalsi.IsEnabled = false;
                bUlozit.IsEnabled = false;
                label14.Foreground = IOproudy.barvaCervena2;
            }
            else
            {
                label14.Foreground = IOproudy.barvaZelena2;
                Bdalsi.IsEnabled = true;
                bUlozit.IsEnabled = true;
            }
        }

        // VYBER ZNACKY
        private void cmbSelection_Dodavatel(object sender, SelectionChangedEventArgs e)
        {
            if (cmbDodavatel.SelectedItem != null)
            {
                _ActualDodavatel.JmenoDodavatele = cmbDodavatel.SelectedItem.ToString();
                Bstart.IsEnabled = true;
            }
            else
            {
                Bstart.IsEnabled = false;
            }
        }

        // zmena stavu checkboxu
        private void NactenoCheckBoxChecked(object sender, RoutedEventArgs e)
        {
            cmbKategorie.Text = string.Empty;
            tbxDlouhyPopis.Text = NactenySeznam[pocitadlo - 1].Popis;
            // orezu popisek pokud je delsi nez 250znaku (kratky popisek)
            tbxKratkyPopis.Text = NactenySeznam[pocitadlo - 1].KratkyPopis.Length >= 250 ? NactenySeznam[pocitadlo - 1].KratkyPopis.Substring(0, 250) : NactenySeznam[pocitadlo - 1].KratkyPopis;
        }

        // zmena stavu checkboxu
        private void NactenoCheckBoxUnchecked(object sender, RoutedEventArgs e)
        {
            tbxKratkyPopis.Text = popisky.KratkyPopis;
            tbxDlouhyPopis.Text = popisky.DlouhyPopis;
            cmbKategorie.Text = popisky.Kategorie;
        }

        #endregion              
    }
}
